if check display mode(800,600,32)=1
   set display mode 800,600,32
else
   if check display mode(800,600,24)=1
      set display mode 800,600,24
   else
      if check display mode(800,600,16)=1
         set display mode 800,600,16
      else
         cls rgb(0,0,0)
         print "You need a better graphic card!!!"
         print "One that supports 800*600 and atleast 16bit hi-colour mode"
         print "32 bit or 24 bit colour recommended"
         print
         print "Press a key to exit"
         wait key
         end
      endif
   endif
endif

randomize timer()
sync rate 100
sync on
sync
rem maxPieces is the maximum images
#constant maxTiles=40
#constant maxLevels=10
#constant maxPieces=64
`#constant maxSelect=2
set text font "Times New Roman"
set text to bold
`define a level
type levels
   xLocation as integer
   yLocation as integer
   midPiece as integer
   endPiece as integer
endtype
dim level(maxLevels) as levels
restore levelData
for t = 1 to maxLevels
   read level(t).xLocation
   read level(t).yLocation
   read level(t).midPiece
   read level(t).endPiece
next t
restore soundData
load bitmap "Graphics\AlphabetTilesSmall2.bmp",1
load image "Graphics\Title.bmp",100,1
load image "Graphics\Logo.bmp",101,1
load sound "Sounds\AlphabetMahjong.wav",100:rem welcome to alphabet mahjong
load sound "Sounds\Correct.wav",101:rem Letter Complete Sound
load sound "Sounds\CompletedLevel.wav",102:rem Level Complete Sound
load sound "Sounds\Congratulations.wav",103:rem you win
load sound "Sounds\YouLose.wav",104:rem sorry you lose
load sound "Sounds\PlayAgain.wav",105:rem play again
load sound "Sounds\10.wav",106
for t=1 to maxTiles
   read ld$
   ld$="Sounds\"+ld$
   load sound ld$,t
next t
dim pieces(maxPieces):dim piecesSelected(maxPieces)
dim piecesToGet(maxTiles):dim spriteImage(maxTiles)
pieceSelect=0
set current bitmap 1
imageNum=1
for y=0 to 3
   for x=0 to 9
      get image imageNum,x*64,y*64,((x*64)+64),((y*64)+64),1
      inc imageNum
   next x
next y
delete bitmap 1
create bitmap 2,800,600
create bitmap 1,800,600
play sound 100:rem welcome to alphabet mahjong
do
   gosub playGame
   play sound 105:rem want to play again
loop
end

playGame:
for levelNum=1 to maxLevels
undim pieces(0):undim piecesToGet(0)
undim piecesSelected(0):undim spriteImage(0)
dim pieces(level(levelNum).endPiece):rem holds all pieces
dim piecesSelected(level(levelNum).endPiece):rem holds selected or not
dim piecesToGet(maxTiles):rem holds number of pieces to get
dim spriteImage(level(levelNum).endpiece):rem holds the sprite images to be displayed
for t=1 to level(levelNum).midPiece
   pieces(t)=(rnd(maxTiles-1)+1)
   piecesSelected(t)=0:spriteImage(t)=pieces(t)
   pieces(level(levelNum).midPiece+t)=pieces(t)
   piecesSelected(level(levelNum).midPiece+t)=0
   piecesToGet(pieces(t))=piecesToGet(pieces(t))+2
   spriteImage(level(levelNum).midPiece+t)=pieces(t)
next t
shufflePieces(levelNum)
xOffset=(260+((5-level(levelNum).xLocation)*64))/2
yOffset=(260+((5-level(levelNum).yLocation)*64))/2
set current bitmap 2
cls rgb(0,0,0)
paste image 100,573,0,1
paste image 101,460,580,1
placeLayer(level(levelNum).xLocation,level(levelNum).yLocation,xOffset,yOffset)
set current bitmap 0:pieceCount=0:piecesRemoved=0:imageNum=rnd(array count(spriteImage(0))-1)+1
copy bitmap 2,1:showLevel(levelNum):sprite 1,mousex(),mousey(),spriteImage(imageNum):show sprite 1
spriteX#=573:spriteY#=128:maxX=736:maxY=516:repeat
copy bitmap 1,0
sync
if mouseclick()=1
   tempSelect=getImage(level(levelNum).xLocation,level(levelNum).yLocation,xOffset,yOffset)
   temp=piecesToGet(pieces(tempSelect))
   set current bitmap 1
   if pieceSelect=0 and piecesSelected(tempSelect)=0
      rem first piece select
      pieceSelect=pieces(tempSelect):selections=1:lastSelection=tempSelect:inc piecesRemoved
      selection(level(levelNum).xLocation,level(levelNum).yLocation,xOffset,yOffset)
      piecesSelected(tempSelect)=1:play sound pieces(tempSelect)
   else
       if pieces(tempSelect)=pieces(lastSelection) and piecesSelected(tempSelect)=0
         rem second piece select
         selection(level(levelNum).xLocation,level(levelNum).yLocation,xOffset,yOffset)
         inc selections:inc piecesRemoved:lastSelection=tempSelect
         piecesSelected(tempSelect)=1:play sound pieces(tempSelect)
      else
         rem must remove selection
         if piecesSelected(lastSelection)=1 then removeSelection(levelNum,lastSelection)
         dec piecesRemoved,selections
         selections=0:pieceSelect=0:lastSelection=0
         copy bitmap 2,1:rem undo selection
         rem select new first piece
         if piecesSelected(tempSelect)=0
            pieceSelect=pieces(tempSelect):selections=1:lastSelection=tempSelect:inc piecesRemoved
            selection(level(levelNum).xLocation,level(levelNum).yLocation,xOffset,yOffset)
            piecesSelected(tempSelect)=1:play sound pieces(tempSelect)
         endif
      endif
   endif
   set current bitmap 0
   if selections=piecesToGet(pieces(tempSelect)) `and selections <>0
      `check if you were selecting right piece
      if pieces(tempSelect)=spriteImage(imageNum)
         wait 200:play sound 101:wait 500:rem letter complete sound
         deleteElement(tempSelect):spriteY#=128
         lastSelection=0:selections=0:imageNum=rnd(array count(spriteImage(0))-1)+1
         copy bitmap 1,2`:inc piecesRemoved,selections:selections=0:temp=0
      else
         `wrong piece so restore
         if piecesSelected(lastSelection)=1 then removeSelection(levelNum,lastSelection)
         dec piecesRemoved,selections
         selections=0:pieceSelect=0:lastSelection=0
         copy bitmap 2,1:rem undo selection
      endif
   endif
endif
if array count(spriteImage(0))>0
   rem show sprite only if there are elements in array
   `sprite 1,mousex(),mousey(),spriteImage(imageNum)
   inc spriteY#,(levelNum/10.00)+.1
   sprite 1,spriteX#,spriteY#,spriteImage(imageNum)
   if spriteY#>maxY
      dec maxY,64:spriteY#=128
      set current bitmap 2:paste image spriteImage(imageNum),spriteX#,maxY+64,1
      set current bitmap 1:paste image spriteImage(imageNum),spriteX#,maxY+64,1
      set current bitmap 0
      if maxY<128 then inc spriteX#,64:maxY=516
      if spriteX#>maxX then play sound 104:showText("You Lose"):wait 500:return
      rem imageNum=rnd(array count(spriteImage(0))-1)+1
   endif
else
   hide sprite 1
endif
until piecesRemoved=level(levelNum).endPiece:wait 200
play sound 102:wait 900:rem level complete sound
if levelNum<10
   play sound 26+levelNum
else
   play sound 106
endif
pieceSelect=0
next levelNum
wait 300:play sound 103:showText("You Win!!!"):wait 1000:rem you win
return


function deleteElement(value as integer)
for t=1 to array count(spriteImage(0))
   if spriteImage(t)=pieces(value)
      array delete element spriteImage(0),t
      exitfunction deleteElement(value):rem recursive call
   endif
next t
endfunction 1

function removeSelection(levelNum,tempSelect)
for t=1 to level(levelNum).endPiece
   if pieces(t)=pieces(tempSelect) then piecesSelected(t)=0
next t
endfunction

function placeLayer(xNum as integer,yNum as integer,xOffset as integer,yOffset as integer)
num=1
for y=0 to yNum-1
   for x=0 to xNum-1
      paste image pieces(num),(x*64)+xOffset,(y*64)+yOffset,1
      inc num
   next x
next y
endfunction

function getImage(xNum as integer,yNum as integer,xOffset as integer,yOffset as integer)
num=1:image=1
for y=0 to yNum-1
   for x=0 to xNum-1
      xx=(x*64)+xOffset:yy=(y*64)+yOffset
      if mousex()>=xx and mousex()<=xx+64 and mousey()>=yy and mousey()<=yy+64 then image=num
      inc num
   next x
next y
endfunction image

function selection(xNum as integer,yNum as integer,xOffset as integer,yOffset as integer)
num=1:ink rgb(0,0,0),rgb(0,0,0)
for y=0 to yNum-1
   for x=0 to xNum-1
      xx=(x*64)+xOffset:yy=(y*64)+yOffset
      if mousex()>=xx and mousex()<=xx+64 and mousey()>=yy and mousey()<=yy+64
         box xx,yy,xx+64,yy+64
      endif
      inc num
   next x
next y
wait 250
endfunction

function shufflePieces(levelNum as integer)
endPiece=level(levelNum).endPiece
rem declare a temp array to put shuffled cards into as they are removed
dim shuffled(endPiece):count=1
for num = endPiece to 1 step -1
   rem get a random number between the last array element and 1
   temp=int(rnd(num-1)+1)
   shuffled(count)=pieces(temp)
   array delete element pieces(0),temp
   inc count
next t
`temporarily remove cards from memory and redim the cards as all
`elements have been removed anyway
undim pieces(0)
dim pieces(endPiece)
`put the shuffled cards back into cards array
for num =1 to endPiece
   pieces(num)=shuffled(num)
next num
undim shuffled(0):`remove array from memory
endfunction

function showLevel(num as integer)
ink rgb(255,0,0),rgb(0,0,0)
create bitmap 4,800,600
set current bitmap 4
cls rgb(0,0,0)
set text size 50
print "Level ",Num
get image 200,0,0,200,50,1
set current bitmap 0
sprite 4,250,200,200:set sprite priority 4,65535
delete bitmap 4:show sprite 4
`for t= 0 to 255 step 1
`   sprite 4,220,200,200:set sprite alpha 4,t
`   copy bitmap 1,0
`   sync:wait 5
`next t
for t= 255 to 0 step -1
   sprite 4,220,250,200:set sprite alpha 4,t
   copy bitmap 1,0
   sync:wait 5
next t
hide sprite 4
endfunction

function showText(myText as string)
ink rgb(255,0,0),rgb(0,0,0)
create bitmap 4,800,600
set current bitmap 4
cls rgb(0,0,0)
set text size 50
print myText
get image 200,0,0,300,50,1
set current bitmap 0
sprite 4,250,200,200:set sprite priority 4,65535
delete bitmap 4:show sprite 4
for t= 0 to 255 step 1
   sprite 4,220,250,200:set sprite alpha 4,t
   copy bitmap 1,0
   sync:wait 5
next t
for t= 255 to 0 step -1
   sprite 4,220,250,200:set sprite alpha 4,t
   copy bitmap 1,0
   sync:wait 5
next t
hide sprite 4
endfunction

levelData:
data 2,2,2,4   :rem Level 1
data 4,2,4,8   :rem Level 2
data 5,2,5,10  :rem Level 3
data 5,4,10,20 :rem Level 4
data 6,4,12,24 :rem Level 5
data 6,6,18,36 :rem Level 6
data 7,6,21,42 :rem Level 7
data 6,8,24,48 :rem Level 8
data 8,7,28,56 :rem Level 9
data 8,8,32,64 :rem Level 10

soundData:
data "a.wav","b.wav","c.wav","d.wav","e.wav","f.wav","g.wav","h.wav","i.wav","j.wav"
data "k.wav","l.wav","m.wav","n.wav","o.wav","p.wav","q.wav","r.wav","s.wav","t.wav"
data "u.wav","v.wav","w.wav","x.wav","y.wav","z.wav","1.wav","2.wav","3.wav","4.wav"
data "5.wav","6.wav","7.wav","8.wav","9.wav","0.wav"
data "orange.wav","violet.wav","blue.wav","purple.wav"